🐍 🔗

Python 连接 MySQL 数据库

让你写的程序,学会跟数据库"开口说话"

🌿 这一章是把前面所学"用起来" —— 就一个固定套路,跟着写一遍就会,不用死记硬背
📌 这节课你只需记住 4 件事
15 步流程:导 → 连 → 游 → 执 → 关
2改数据 必须 commit,否则白改
3查数据用 fetch 一族把结果取出来
4try-except 给改数据上把"保险"

💡 上课前先想一个再常见不过的场景:

📚 你做了个图书管理网站,用户输入书名要查信息。可浏览器自己不会去查数据库
🤝 中间得有个"中间人":一边接收网页请求,一边操作 MySQL,再把结果送回去。

这个中间人,就是 Python 程序(也可以是 Java、PHP)。Web 开发、数据分析、爬虫,第一步都是它。

👉 本章就讲一件事:怎么用 Python 跟 MySQL"对话"

1

Python 怎么跟 MySQL 说话

先装一个"翻译包",再认识两个主角

一个统一标准:DB API

📖 一句话定义

Python DB API 是 Python 访问数据库的统一标准。连 MySQL、连 Oracle、连 SQLite,套路几乎一样 —— 学会一种,其他都会

🌰 把它想成"USB 接口"

插鼠标、插键盘、插 U 盘,插孔和用法都一样,只是里面是不同设备。

用 Python 连不同数据库也一样:代码套路统一,换数据库不用从头学。

装一个包:mysql-connector-python

Python 标准库不能直接连 MySQL,要装个第三方包。用 MySQL 官方维护的这个最省心:

命令行 · 安装
# 在命令行(不是 Python 里)运行
pip install mysql-connector-python

装完,在 Python 里写 import mysql.connector 就能用了。

两个主角:Connection 和 Cursor

整章你只跟两个对象打交道,分工很清楚:

🔌Connection 连接

跟数据库的"那根网线"。

管:连进来、提交、关闭

常用:cursor() / commit() / rollback() / close()

🖊️Cursor 游标

真正"干活的那支笔"。

管:执行 SQL、取结果

常用:execute() / fetchone() / fetchall()

🧠记住
连接管"通道",游标管"干活"。
连上数据库用 connect,执行 SQL 和取结果都靠 cursor
2

5 步流程:固定套路

不管做什么操作,都是这 5 步 —— 这是全章的骨架

导 → 连 → 游 → 执 → 关

1
导入
import
2
连接
connect()
3
游标
cursor()
4
执行
execute()
5
关闭
close()
🧠口诀
导 → 连 → 游 → 执 → 关
先导入包,再连上库,开个游标,执行 SQL,最后关掉。后面所有例子都是这 5 步,只有第 4 步的 SQL 在变。

第 2 步细看:connect() 的参数

连接时要告诉它"连到哪、用谁的账号",一共 5 个参数:

参数含义常见值
host数据库服务器地址'localhost'
user登录用户名'root'
passwd登录密码'123456'
database要操作哪个库'teaching'
port端口,可省略3306
⚠️ 两个小提醒

① 这个数据库必须先存在,连接才成功(新库要先在 MySQL 里 CREATE DATABASE)。

② 前 4 个是必填,port 可以不写(默认就是 3306)。

第一个完整例子:查一下数据库版本

把 5 步串起来,跑通"连上 → 查个东西 → 关掉"这条最短路径:

Python · 完整例子
import mysql.connector                      # ① 导入

db = mysql.connector.connect(                # ② 连接
    host='localhost',
    user='root',
    passwd='123456',
    database='teaching'
)
cursor = db.cursor()                          # ③ 开游标
cursor.execute("SELECT VERSION()")            # ④ 执行 SQL
data = cursor.fetchone()                     # 取一行结果
print("数据库版本:", data)

cursor.close()                               # ⑤ 关闭
db.close()
▶ 运行结果:数据库版本: ('8.0.23',)
💬 一个小细节

fetchone() 拿回来的是一个元组('8.0.23',)(带括号、末尾有逗号)。

想要里面的字符串本身,用 data[0] 取第一个就行。

3

增删改查(CRUD)

好消息:增、删、改的代码长得几乎一模一样

增 / 删 / 改:换汤不换药

✅ 先记住这个,省一半力气

INSERT、UPDATE、DELETE 三种"改数据"的代码结构完全一样 —— 都要 commit、都用 try-except 包起来,只有那句 SQL 不同。学会一个,三个全会。

插入一名新学生为例,这就是"改数据"的标准长相:

Python · 插入数据
cursor = db.cursor()
try:
    cursor.execute("INSERT INTO s VALUES('s9','王天一','女',18,'计算机','信息学院')")
    db.commit()                # ⭐ 改完必须提交!
    print("插入成功")
except:
    db.rollback()              # 出错就撤销
    print("插入失败")

把那句 SQL 换一下,就变成改和删 —— 其余一个字都不用动:

改 / 删:只换 SQL
# 改:把林毅的专业改成计算机
"UPDATE s SET maj='计算机' WHERE sn='林毅'"

# 删:删掉学号 s12 的学生
"DELETE FROM s WHERE sno='s12'"
💬 想知道改了几行?

执行后看 cursor.rowcount,它会告诉你这次影响了多少行。改/删时特别有用。

查:fetch 三件套

查询用 SELECT,但结果得用 fetch 取出来。看你要几行,挑一个用:

方法取多少拿回来是什么
fetchone()一行一个元组 ('s1','王彤',…)
fetchall()全部行元组的列表 [(…),(…)]
fetchmany(n)n 行元组的列表(最多 n 个)

查所有 20 岁及以上的学生,挨个打印:

Python · 查询多行
cursor.execute("SELECT * FROM s WHERE age >= 20")
results = cursor.fetchall()        # 全部取回,是个列表

for row in results:           # 一行一行打印
    print(row)
🧠分清
只要一行用 fetchone,要全部用 fetchall。
fetchone 给元组,fetchall 给列表;数据量大但只看前几条,用 fetchmany(n)
4

事务:commit 和 rollback

本章最容易忘、也最关键的一步

为什么"改完一定要 commit"?

📖 关键

execute() 改数据时,改动先放在缓冲区,并没有真的写进 MySQL。必须调用 db.commit(),改动才真正"落盘"。

🌰 就像"在电脑上写文档"

execute() = 在编辑器里打字(屏幕上看得见);

commit() = 点那个"保存"按钮(才真的存进硬盘)。

不点保存就关掉,刚打的字全没了 —— 不 commit,也是一样白干

🧠口诀
读不 commit,写必 commit。
SELECT 只是看,不用提交;INSERT/UPDATE/DELETE 改了数据,必须 commit 才算数。

rollback 和 try-except:给操作上保险

db.rollback() 的作用是撤销:把还没 commit 的改动全部退回,就当没发生过。配合 try-except,就成了改数据的"黄金套路":

改数据 · 标准模板(背下来)
try:
    cursor.execute(sql1)      # 执行 SQL(可以多条)
    cursor.execute(sql2)
    db.commit()               # 全部成功 → 一起提交
except:
    db.rollback()             # 任何一条失败 → 全部撤销
💬 这样能保证什么?

批量插入时,万一中间一条出错,前面成功的也会被一起撤销 —— 要么全成功,要么全失败,不会留下"改了一半"的烂摊子。这就是第 9 章学过的事务原子性,在 Python 里的样子。

🧠模板
try 里执行 + commit,except 里 rollback。
凡是改数据,都套这个壳,数据就乱不了。

一张图看懂:读 和 写 的区别

本章最该带走的一页 —— 看懂这张图,这章就过关了
✍️

写数据

INSERT / UPDATE / DELETE

要 commit,要 try-except

"改完得保存"
VS
👀

读数据

SELECT + fetch

不用 commit,直接取结果

"看看而已"
对比项写数据(增/改/删)读数据(查)
用的 SQLINSERT / UPDATE / DELETESELECT
要 commit 吗✅ 必须❌ 不用
要 try-except 吗✅ 要(保安全)❌ 不必
怎么拿结果rowcount(改了几行)fetch 取数据
🧠一句话
写要"保存",读只"取出"。
分不清要不要 commit?就问自己:这步是在改数据,还是只在看数据
🎯 记住这三句,就够了
  1. Python 连 MySQL 永远是 5 步导 → 连 → 游 → 执 → 关,靠 mysql.connector 这个包。
  2. 改数据(增/改/删)必须 commit,并套上 try-except + rollback 保证安全。
  3. 查数据用 fetch(一行 fetchone、全部 fetchall),不用 commit

🎓 到这一章,整门课就讲完了

回头看看,这一学期你其实已经走完了一条完整的路 —— 从"认识数据库"到"亲手用数据库":

关系模型、SQL 查询、视图
安全管理、并发控制、备份还原
需求分析、E-R 图、规范化设计
存储过程、函数、触发器、事件
用 Python 把数据库真正"用起来"
能造、能管、能查、能开发

这些连起来,就是一套"既会造、又会用"的真本事。无论你之后做 Web、做数据、还是做后端,它们都还会一次次派上用场。下一步想继续走,可以看看 Redis、MongoDB,或者 Flask / Django。👇 先去把这一章上机练一遍。